package _go

/*77. 组合
给定两个整数 n 和 k，返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。



示例 1：

输入：n = 4, k = 2
输出：
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
示例 2：

输入：n = 1, k = 1
输出：[[1]]*/
var res [][]int

func combine(n int, k int) [][]int {
	res = [][]int{}
	dfs(n, k, 1, map[int]bool{}, []int{})
	return res
}

// index 目前遍历的位置 做去重用
// use 已经使用过的数字
//path 路径
func dfs(n, k, index int, use map[int]bool, path []int) {
	if k == len(path) {
		tmp := make([]int, len(path))
		copy(tmp, path)
		res = append(res, tmp)
		return
	}

	for i := index; i <= n; i++ {
		if use[i] {
			continue
		}
		path = append(path, i)
		use[i] = true
		dfs(n, k, i+1, use, path)
		use[i] = false
		path = path[:len(path)-1]
	}
}
